<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对象新增的方法</title>
</head>
<body>
<script>
// 1、is()比较两个值是否严格相等,等价 ===
Object.is('foo', 'foo') // true
Object.is({}, {}) // false
Object.is(NaN, NaN) // true,这个和===有区别, NaN===NaN为false

// 2、assign()
// 用于合并多个对象到目标对象中,注意，只能合并可枚举属性
// 可以用来浅拷贝，如果源对象某个属性的值是对象，那么目标对象拷贝得到的是这个对象的引用。
// 应用：为对象添加属性、方法、克隆
var target2 = {};
var obj2 = { a: 1, b: 2, o : { name: '波仔'}};
Object.assign(target2, obj2)
obj2.o.name = '刘德华';
console.log(target2)


// 3、setPrototypeOf()
// 用与__proto__相同，用来设置一个对象的原型对象（prototype）
var prot3 = {
    name: '波仔',
    age: 18
}
var obj3 = {
    say() {
        console.log('hello world')
    },
    // __proto__: obj3Pro
}
Object.setPrototypeOf(obj3, prot3);
console.log(obj3.__proto__) // {name: "波仔", age: 18}
console.log(obj3.name) // 波仔

// 4、getPrototypeOf() 
// 用于读取一个对象的原型对象
Object.getPrototypeOf(obj3) === prot3; // true



// 5、values() keys() entries()结合 for of
let obj5 = { a: 1, b: 2}
for (let key of Object.keys(obj5)) { 
    console.log(key) // a b
}

// 6、fromEntries
// Object.fromEntries()方法是Object.entries()的逆操作，用于将一个键值对数组转为对象。
Object.fromEntries([
  ['foo', 'bar'],
  ['baz', 42]
]) // // { foo: "bar", baz: 42 }

// 7、create方法
// 创建一个新对象，使用现有的对象来提供新创建的对象的__proto__
var proto7 = {
    name: '波仔'
}
var obj7 = Object.create(proto7, {
    // foo会成为所创建对象的数据属性,且foo必须为一个对象；可设置新对象的foo属性的可读性，可配置性以及值
    foo: { 
        writable:true,
        configurable:true,
        value: "hello" 
    }
});
console.log(obj7.__proto__) // {name: '波仔'}
obj7.sex = '男'
obj7.name = '波波'
console.log(proto7) // {name: '波仔'}

var a = { rep: 'apple' }
var b = Object.create(a)
console.log(b)  // {}
console.log(b.__proto__) // {rep: "apple"}

var c = Object.create(Object.prototype, {
    foo: { 
        writable:true,
        configurable:true,
        value: "hello" 
    }
})


</script>
</body>
</html>